package com.fdb.efp.nls.service.dao;

import com.fdb.efp.nls.service.domain.LoanRepayPlan;
import com.fdb.efp.loan.service.vo.LoanRepayPlanVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;

import java.util.List;

public interface LoanRepayPlanDao {
	int insert(LoanRepayPlan loanRepayPlan);
	int insertSelective(LoanRepayPlan loanRepayPlan);
	int updateByPkRefNbrAndStatus(LoanRepayPlan loanRepayPlan);
	int updateByPkRefNbrAndTerm(LoanRepayPlan loanRepayPlan);
	int deleteByRefNbrAndTerm(LoanRepayPlan loanRepayPlan);
	//LoanRepayPlan getLoanRepayPlanByRefNbrAndStatus(LoanRepayPlan loanRepayPlan);
	
	LoanRepayPlan getLoanRepayPlanByRefNbrAndTerm(LoanRepayPlan lPlan);	
	List<LoanRepayPlan> getBankRepayPlanListByRefNbr(LoanRepayPlan lPlan);		
	List<LoanRepayPlan> getLoanByDateAndStatus(LoanRepayPlan lPlan);	
	
	LoanRepayPlan getLoanRepayPlanByRefNbrAndMaxTerm(LoanRepayPlan loanRepayPlan);
	List<LoanRepayPlan> queryAllLoanRepayPlan(LoanRepayPlan queryLoanRepayPlan);
	
	List<LoanRepayPlan> qryLnRyPlanByLoanNoByPage(LoanRepayPlan loanRepayPlan);

	List<LoanRepayPlan> queryPageByRefNbr(@Param("refNbr") String refNbr, RowBounds rowBounds);

	Integer queryCountByRefNbr(@Param("refNbr") String refNbr);

	/**
	 * 
	 * 通过借据号、违约标志查询还款计划信息 <br>
	 * 0.1:ludayong:2019年3月5日 下午9:56:23:新增 <br>
	 * @author ludayong
	 * @since 2019年3月5日 下午9:56:23
	 * @date 2019年3月5日 下午9:56:23
	 * @version 0.1
	 */
	List<LoanRepayPlan> queryLoanRepayPlanByLoanNoAndOverdueFlag(LoanRepayPlan loanRepayPlan);
	
	/**
	 * 
	 * 批量新增还款计划信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:34:07:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月11日 下午9:34:07
	 * @date 2019年3月11日 下午9:34:07
	 * @version 0.1
	 */
	public int batchInsertLoanRepayPlan(List<LoanRepayPlan> addList);

	/**
	 * 
	 * 批量更新还款计划信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:34:07:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月11日 下午9:34:07
	 * @date 2019年3月11日 下午9:34:07
	 * @version 0.1
	 */
	public int batchUpdateLoanRepayPlan(List<LoanRepayPlan> updateList);
	
	/**
	 * 
	 * 通过借据编号和期数更新还款计划信息 <br>
	 * 0.1:ludayong:2019年3月11日 下午9:34:07:新增 <br>
	 * 
	 * @author ludayong
	 * @since 2019年3月20日 下午9:34:07
	 * @date 2019年3月20日 下午9:34:07
	 * @version 0.1
	 */
	int updateByLoanRepayPlanByRefNbrAndTerm(LoanRepayPlan loanRepayPlan);
	
	 /**
	 * 
	 * 日初借据分期计划临时表数据到分期计划表有数据则更新，无则新增 <br>
	 * 0.1:weijj:2019年5月7日 下午2:37:18:新增 <br>
	 * 
	 * @author weijj
	 * @since 2019年5月7日 下午2:37:18
	 * @date 2019年5月7日 下午2:37:18
	 * @version 0.1
	 */
	public int insertOrUpdateLoanRepayPlan(List<LoanRepayPlan> list);
	/**
	 * 插入或者更新对应的还款计划: <br>
	 * 0.1:caoxin:2019/5/15 15:26: TODO: <br>
	 *
	 * @return
	 * @author caoxin
	 * @date 2019/5/15 15:26
	 * @version 0.1
	 * @since 2019/5/15 15:26
	 */
//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:插入或者更新对应的还款计划
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//    int insertOrUpdateBdMoneyDraw(List<LoanRepayPlan> list);

	int batchInsert(List<LoanRepayPlanVO> loanRepayPlanVOList);

	List<LoanRepayPlan> queryMinOverdueTerm(@Param("bizDate") String bizDate);
////	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	List<LoanRepayPlan> queryMinOverdueTerm(@Param("bizDate") String bizDate);
////	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//	List<LoanRepayPlan> queryCreditReportingData(@Param("prdInfoIds") List<String> prdInfoIds, @Param("batchDate") String batchDate);
//	
	/**
	 * 根据贷款账号查询逾期的还款计划: <br>
	 *
	 * 0.1:caoxin:2019/6/27 17:50: 根据贷款账号查询逾期的还款计划: <br>
	 * @author caoxin
	 * @return
	 * @since 2019/6/27 17:50
	 * @date 2019/6/27 17:50
	 * @version 0.1
	 */
    List<LoanRepayPlan> queryRepayPlanByRefNbrAndStatus(LoanRepayPlanVO loanRepayPlanVO);
//    
//    /**
//     * 查询当前期数: <br>
//     * 0.1:caoxin:2019/6/27 19:08: 查询当前期数 <br>
//     * @author caoxin
//     * @return
//     * @since 2019/6/27 19:08
//     * @date 2019/6/27 19:08
//     * @version 0.1
//     */

//	@author:liuty
//	@date:2019/10/17
//	涉及产品:税e贷
//	功能:查询当前期数
//	原因:增量投产只投了接口没投实现，编译报错因此注释，不影响当前产品实际业务
//    int queryCurrentTerm(@Param("batchDate") String date,@Param("billNo") String billNo);
//

    /**
     * 需求编号：【2019D0519】（业务提的需求编号）
     * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
     * 开发人员：qiuyf
     * 创建日期：2019年7月1日 下午9:18:21
     * 功能描述：根据借据编号删除还款计划信息
     */
    public int deleteByRefNbr(String refNbr);

    /**
     * 需求编号：【2019D0519】（业务提的需求编号）
     * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
     * 开发人员：qiuyf
     * 创建日期：2019年7月22日 下午8:33:06
     * 功能描述：通过借据号查询还款计划（注意：但只是查询需要的部分字段）
     */
    public List<LoanRepayPlan> qryAllByLoanNo(String refNbr);

	/**
	 * 根据批次号查询当前期数: <br>
	 * 0.1:caoxin:2019/6/27 19:09: 根据批次号查询当前期数:<br>
	 * @author caoxin
	 * @return
	 * @since 2019/6/27 19:09
	 * @date 2019/6/27 19:09
	 * @version 0.1
	 */
    Integer queryCurrentTerm(@Param("batchDate") String date, @Param("billNo") String billNo);

	/**
	 * 根据借据号和是否逾期过查询还款计划信息
	 * @param loanRepayPlanVO
	 * @return
	 */
	List<LoanRepayPlan> queryRepayPlanByRefNbrAndIsOverDue(LoanRepayPlanVO loanRepayPlanVO);

	/**
	 * 根据借据号查询所有还款计划
	 *
	 * @param list 借据号列表
	 * @return
	 */
	List<LoanRepayPlan> queryRepayPlansByRefNbr(@Param("list") List<String> list);

	/**
	 * 根据产品id修复还款总期数的值
	 * @param prdId
	 * @return
	 */
	int fixInitTerm(@Param("prdId") String prdId);

	/**
	 * 根据借据号获取逾期的还款计划的结清日期（取得是还款计划期数最小得）
	 * @param list
	 * @return
	 */
	List<LoanRepayPlan> queryMinOverdueStmtDates(@Param("list") List<String> list);

	/**
	 * 插入或者更新对应的还款计划: <br>
	 * 0.1:caoxin:2019/5/15 15:26: TODO: <br>
	 *
	 * @return
	 * @author caoxin
	 * @date 2019/5/15 15:26
	 * @version 0.1
	 * @since 2019/5/15 15:26
	 */
	int insertOrUpdateBdMoneyDraw(List<LoanRepayPlan> list);

    int insertOrUpdatePsd(List<LoanRepayPlan> list);

    int insertOrUpdateYed(List<LoanRepayPlan> list);

	List<LoanRepayPlan> getLoanRepayPlanByRefNbrAndStatus(LoanRepayPlan loanRepayPlan);


	/**
	 * 需求编号：【2020D1309】（业务提的需求编号）
	 * 问题编号：【xxxxxxx】（若不是因为修复问题而新增该类，则留空）
	 * 开发人员：wanglaisheng
	 * 创建日期：2020年11月23日
	 * 功能描述：通过借据号查询还款计划（注意：不包含缩期部分数据）
	 */
	List<LoanRepayPlan> getPlanByPKWithoutCancelStatusByPage(LoanRepayPlan qryLoanRepayPlan);
}